/*
@Date:2025/6/5
*/

import org.junit.Test;
import org.springframework.cglib.proxy.Enhancer;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyTextAop {
    //定义租房服务接口
    interface fangdong {
        //核心房屋出租
        void zufang();
    }

    //房东接口实现
    static class fangdongImpl implements fangdong {
        @Override
        public void zufang() {
            System.out.println("核心，签合同");
        }
    }

    public void testjdk() {
        //创建目标对象 实际服务
        fangdongImpl fangdong = new fangdongImpl();
        //处理额外逻辑
        InvocationHandler invocationHandler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("前置增强 发布信息");
                System.out.println("前置增强 看房");
                //核心
                Object invoke = method.invoke(fangdong, args);
                System.out.println("后置增强 收钱");
                return invoke;
            }
        };
        //创建代理对象
        ProxyTextAop.fangdong fangdong1 = (fangdong) Proxy.newProxyInstance(ProxyTextAop.class.getClassLoader(),//类加载器
                new Class[]{fangdong.class},//代理接口
                (InvocationHandler) fangdong);//调用处理器

        //代理调用对象方法
        System.out.println("------");
        fangdong1.zufang();
    }

@Test
    public void textCGLib(){
        //1.创建目标对象
        fangdongImpl fangdong = new fangdongImpl();
        //2.创建增强器（CGLIB核心类）
        Enhancer enhancer = new Enhancer();
        //设置父类 （CGLIB通过继承生成代理子类）
        enhancer.setSuperclass(fangdongImpl.class);
        //回调处理器
        enhancer.setCallback(new org.springframework.cglib.proxy.InvocationHandler(){

            @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                System.out.println("发布房屋信息（CGLIB代理的前置广告）");
                System.out.println("带租客看房（CGLIB代理的前置广告）");
                fangdong.zufang();//直接调用方法
                return null;
            }
        });
        fangdongImpl proxy = (fangdongImpl) enhancer.create();
        proxy.zufang();
    }


}
